
import UIManager from "../../ui/UIManager"
import BaseView from "../view/BaseView";
import TSMap from "../../math/TSMap";
import BaseModel from "../model/BaseModel";
import EventDispatcher  from "../../event/EventDispatcher";
/**
 * 所有控制器的父类，可以通知消息，添加观察者。
 */
export default class BaseController extends EventDispatcher {

    // 用于解决一个界面在异步打开的时候重复点击的问题。
    // private static  isOpening:TSMap = new TSMap();

    /**
     * 进入一个场景时调用。
     * @param name 场景的名称
     * @param model 模型对象。
     */
    enterScene(name, model, func?) {
        // cc.log(" enterScene sceneName ",name);

        UIManager.instance().enterScene(name,(err,node)=>{
            // BaseController.isOpening.set(name,false);
            if(err){
                cc.log(" BaseController enterScene error "+name+" err "+err);
                return;
            }
    
            let component = this.initView(node,name,model);
            if (func) func(component);
        })

    }
    

    
    /**
     *
     * 使用预制体的名称初始化节点，主要目的时给view传递controller和model
     * @param node 节点 可以是cc.instance()的，也可以是重PoolManager获取的。
     * @param name 组件的名称
     * @param model 模型数据。
     */
    initView(node:cc.Node,name,model?:BaseModel){
        let component:BaseView = node.getComponent(name);
        if(!component){
            component = node.addComponent(name); 
        }
        component.setController(this);
        if(model){
            component.setModel(model);
        }
        return component;
    }

    /**
     * 弹出一个界面时调用。
     * @param name 预制体的名称
     * @param model 模型对象
     * @param node 为添加预制体的节点，如果为null 将作为弹出界面弹出。
     */
    pushView(name:string,model:BaseModel,parent?:cc.Node,func?:Function,isPool:boolean = false){
        // if(BaseController.isOpening.get(name) && !parent){
        //     return;
        // }
        // BaseController.isOpening.set(name,true);        
        UIManager.instance().getPrefab(name,(err,node:cc.Node)=>{
            // BaseController.isOpening.set(name,false);
            if(err  || !cc.isValid(node)){
                cc.log(" pushView err "+err+"  name "+name);
                return;
            }
            let component = this.initView(node,this.getClassName(name),model);
            if(component){
                if(parent){
                    // parent.addChild(node);
                    node.setParent(parent);
                }else{
                    component.show();
                }    
                if(func){
                    func(component);
                }                            
            }else{
                cc.warn(" comp is null ",name);
            }
        },isPool)
    }


    getClassName(prefabName){
        let className = "";
        if(prefabName.indexOf("/") >= 0){
            let list = prefabName.split("/");
            className = list[list.length-1];
        }else{
            className = prefabName;
        }   
        return className;     
    }z
}
